<?php
/**
 * @copyright 2025 银杏ERP
 * @author 银杏ERP
 * @version 1.0
 * @license http://www.hhyx.xyz
 * @developer Lhf
 */

namespace app\admin\model\yxerp;

use app\common\model\BaseModel;
use think\model\relation\BelongsTo;
use think\model\relation\HasMany;

/**
 * 采购单模型
 */
class Purchase extends BaseModel
{
    // 表名
    protected $name = 'yxerp_purchase';
    
    // 自动写入时间戳
    protected $autoWriteTimestamp = true;
    
    // 可批量赋值的属性
    protected $fillable = [
        'order_no',
        'supplier_id',
        'warehouse_id',
        'order_date',
        'delivery_date',
        'total_amount',
        'discount_amount',
        'payment_amount',
        'status',
        'creator_id',
        'approver_id',
        'submit_time',
        'approval_time',
        'complete_time',
        'cancel_time',
        'cancel_reason',
        'payment_method',
        'payment_status',
        'payment_time',
        'shipping_method',
        'shipping_cost',
        'tax_rate',
        'tax_amount',
        'remarks',
        'attachment',
    ];
    
    // 追加属性
    protected $append = [
        'status_text',
        'payment_status_text',
    ];
    
    /**
     * 状态文本映射
     */
    public static $statusMap = [
        'draft' => '草稿',
        'pending' => '待审批',
        'approved' => '已审批',
        'rejected' => '已拒绝',
        'completed' => '已完成',
        'cancelled' => '已取消',
    ];
    
    /**
     * 付款状态文本映射
     */
    public static $paymentStatusMap = [
        'unpaid' => '未支付',
        'partial' => '部分支付',
        'paid' => '已支付',
        'refunding' => '退款中',
        'refunded' => '已退款',
    ];
    
    /**
     * 获取状态文本
     * @param mixed $value
     * @param array $data
     * @return string
     */
    public function getStatusTextAttr($value, $data)
    {
        return isset($data['status']) ? self::$statusMap[$data['status']] ?? '' : '';
    }
    
    /**
     * 获取付款状态文本
     * @param mixed $value
     * @param array $data
     * @return string
     */
    public function getPaymentStatusTextAttr($value, $data)
    {
        return isset($data['payment_status']) ? self::$paymentStatusMap[$data['payment_status']] ?? '' : '';
    }
    
    /**
     * 设置订单日期
     * @param mixed $value
     * @return string
     */
    public function setOrderDateAttr($value)
    {
        return $value ? date('Y-m-d', strtotime($value)) : date('Y-m-d');
    }
    
    /**
     * 设置交付日期
     * @param mixed $value
     * @return string
     */
    public function setDeliveryDateAttr($value)
    {
        return $value ? date('Y-m-d', strtotime($value)) : null;
    }
    
    /**
     * 供应商关联
     * @return BelongsTo
     */
    public function supplier()
    {
        return $this->belongsTo(Supplier::class, 'supplier_id');
    }
    
    /**
     * 仓库关联
     * @return BelongsTo
     */
    public function warehouse()
    {
        return $this->belongsTo(Warehouse::class, 'warehouse_id');
    }
    
    /**
     * 创建人关联
     * @return BelongsTo
     */
    public function creator()
    {
        return $this->belongsTo('app\admin\model\Admin', 'creator_id')->bind(['creator_name' => 'nickname']);
    }
    
    /**
     * 审批人关联
     * @return BelongsTo
     */
    public function approver()
    {
        return $this->belongsTo('app\admin\model\Admin', 'approver_id')->bind(['approver_name' => 'nickname']);
    }
    
    /**
     * 采购明细关联
     * @return HasMany
     */
    public function details()
    {
        return $this->hasMany(PurchaseDetail::class, 'purchase_id');
    }
    
    /**
     * 搜索器：订单编号
     * @param $query
     * @param $value
     */
    public function searchOrderNoAttr($query, $value)
    {
        if (!empty($value)) {
            $query->where('order_no', 'like', "%{$value}%");
        }
    }
    
    /**
     * 搜索器：供应商ID
     * @param $query
     * @param $value
     */
    public function searchSupplierIdAttr($query, $value)
    {
        if (!empty($value)) {
            $query->where('supplier_id', $value);
        }
    }
    
    /**
     * 搜索器：仓库ID
     * @param $query
     * @param $value
     */
    public function searchWarehouseIdAttr($query, $value)
    {
        if (!empty($value)) {
            $query->where('warehouse_id', $value);
        }
    }
    
    /**
     * 搜索器：订单日期范围
     * @param $query
     * @param $value
     */
    public function searchOrderDateRangeAttr($query, $value)
    {
        if (!empty($value) && is_array($value)) {
            if (!empty($value[0]) && !empty($value[1])) {
                $query->whereTime('order_date', 'between', $value);
            }
        }
    }
    
    /**
     * 搜索器：交付日期范围
     * @param $query
     * @param $value
     */
    public function searchDeliveryDateRangeAttr($query, $value)
    {
        if (!empty($value) && is_array($value)) {
            if (!empty($value[0]) && !empty($value[1])) {
                $query->whereTime('delivery_date', 'between', $value);
            }
        }
    }
    
    /**
     * 搜索器：状态
     * @param $query
     * @param $value
     */
    public function searchStatusAttr($query, $value)
    {
        if (!empty($value)) {
            $query->where('status', $value);
        }
    }
    
    /**
     * 搜索器：付款状态
     * @param $query
     * @param $value
     */
    public function searchPaymentStatusAttr($query, $value)
    {
        if (!empty($value)) {
            $query->where('payment_status', $value);
        }
    }
    
    /**
     * 搜索器：创建人ID
     * @param $query
     * @param $value
     */
    public function searchCreatorIdAttr($query, $value)
    {
        if (!empty($value)) {
            $query->where('creator_id', $value);
        }
    }
    
    /**
     * 搜索器：审批人ID
     * @param $query
     * @param $value
     */
    public function searchApproverIdAttr($query, $value)
    {
        if (!empty($value)) {
            $query->where('approver_id', $value);
        }
    }
    
    /**
     * 搜索器：金额范围
     * @param $query
     * @param $value
     */
    public function searchAmountRangeAttr($query, $value)
    {
        if (!empty($value) && is_array($value)) {
            if (isset($value[0]) && is_numeric($value[0])) {
                $query->where('total_amount', '>=', $value[0]);
            }
            if (isset($value[1]) && is_numeric($value[1])) {
                $query->where('total_amount', '<=', $value[1]);
            }
        }
    }
} 